package com.itheima.reggie.service.impl;

import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.itheima.reggie.entity.Category;
import com.itheima.reggie.entity.PageParam;
import com.itheima.reggie.exception.CustomException;
import com.itheima.reggie.mapper.CategoryMapper;
import com.itheima.reggie.service.CategoryService;
import com.itheima.reggie.service.DishService;
import com.itheima.reggie.service.SetMealService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;

import java.util.List;

@Service
@Transactional
public class CategoryServiceImpl  implements CategoryService {
    
    @Autowired
    private CategoryMapper mapper;
    
    @Autowired
    private DishService dishService;
    
    @Autowired
    private SetMealService setMealService;
    
    /**
     * 根据分类的id来查询分类对象
     *
     * @param id
     * @return
     */
    @Override
    public Category findById(long id) {
        return mapper.selectById(id);
    }
    
    /**
     * 根据类型来查找分类数据
     *
     * @param type
     * @return
     */
    @Override
    public List<Category> findCategoryByType(Integer type) {
        
        //1. 创建查询条件
        
        //后台的语句
        //select * from category where type = 1 ;
        //select * from category where type = 2 ;
        
        //前台的语句
        //select * from category;
        
        LambdaQueryWrapper<Category> qw = new LambdaQueryWrapper<>();
        qw.eq(type != null , Category::getType , type);
        
        //添加一个排序  先按排序的序号 升序排序，如果排序序号一样，再用更新时间来降序排序
        qw.orderByAsc(Category::getSort).orderByDesc(Category::getUpdateTime);
        
        
        return mapper.selectList(qw);
    }
    
    /**
     * 更新分类
     *
     * @param category
     * @return
     */
    @Override
    public int update(Category category) {
        return mapper.updateById(category);
    }
    
    /**
     * 删除分类
     *  1. 不能直接就去删除分类表的数据
     *  2. 需要去查询菜品表(dish) 和 套餐表(setmeal) ，里面有没有属于这种分类的数据
     *      2.1 如果有，就不能删除。 抛出异常，给前端一个提示。
     *      2.2 如果没有，就可以删除这种分
     *
     *  3. 分类只会是一种分类，要么是菜品的分类，要么是套餐的分类，如果两张表都要执行查询，那么效率就有点低了。
     *  4. 可以在前端页面执行删除操作的时候，除了把分类的id传递过来，还可以把分类的类型 (type) 给传递过来，这样就好判断是哪一种类型的分类。
     *      此时就知道要去查询哪张表了。
     *
     * @param categoryId
     * @return
     */
    @Override
    public int delete(long categoryId) {
        
        //1. 先去查询菜品表，看看菜品表里面有没有什么菜品属于这种分类。
        int count = dishService.findCountByCategoryId(categoryId);
        if(count > 0 ){ //即表示这种分类有菜品数据关联着，
            throw  new CustomException("该分类存在菜品数据，禁止删除！");
        }
    
        //2. 去查询套餐表，看看套餐表里面有没有什么套餐属于这种分类。
        count = setMealService.findCountByCategoryId(categoryId);
        if(count > 0){ //即表示这种分类有套餐数据关联着
            throw  new CustomException("该分类存在套餐数据，禁止删除！");
        }
        
        return mapper.deleteById(categoryId);
    }
    
    /**
     * 分页查询
     *
     * @param pageParam
     * @return
     */
    @Override
    public IPage<Category> findPage(PageParam pageParam) {
        
        //1. 定义查询第几页，每页查询多少条
        IPage<Category> page  = new Page<>(pageParam.getPage() , pageParam.getPageSize());
        
        //2. 执行分页查询
        return mapper.selectPage(page, null);
    }
    
    /**
     * 添加分类
     *
     * @param category
     * @return
     */
    @Override
    public int add(Category category) {
        return mapper.insert(category);
    }
}
